/// <reference types="node" />
// import { Options } from '@vitejs/plugin-vue'
import { mkdirSync } from 'fs'
import type { OutputOptions } from 'rollup'
import { PluginOption } from 'vite'
import * as zipHelper from './zipHelper'

const fs = require('fs') as any
const path = require('path') as any

function format(date: Date, patternStr: string) {
  const o = {
    'M+': date.getMonth() + 1,
    'd+': date.getDate(),
    'H+': date.getHours(),
    'm+': date.getMinutes(),
    's+': date.getSeconds(),
    'S+': date.getMilliseconds(),
  }
  // 因为date.getFullYear()出来的结果是number类型的,所以为了让结果变成字符串型，下面有两种方法：
  if (/(y+)/.test(patternStr)) {
    // 第一种：利用字符串连接符“+”给date.getFullYear()+''，加一个空字符串便可以将number类型转换成字符串。
    patternStr = patternStr.replace(RegExp.$1, (date.getFullYear() + '').substring(4 - RegExp.$1.length))
  }

  Object.entries(o).forEach(([key, value]) => {
    if (new RegExp('(' + key + ')').test(patternStr)) {
      // 第二种：使用String()类型进行强制数据类型转换String(date.getFullYear())，这种更容易理解。
      // @ts-ignore
      patternStr = patternStr.replace(RegExp.$1, RegExp.$1.length === 1 ? value : ('00' + value).substring(String(value).length))
    }
  })

  return patternStr
}

/**
 * 将编译后的输出目录压缩成zip包，压缩包默认存放到zip文件夹下
 */
export default function (): PluginOption {
  return {
    name: 'zip-plugin',
    enforce: 'post',
    apply: 'build',
    writeBundle: (options: OutputOptions) => {
      const sourcePath = path.resolve(options.dir + '/')
      const dirname = path.dirname(sourcePath)
      const basename = path.basename(sourcePath)

      const zipFilePath = dirname + path.sep + 'zip' + path.sep + basename + '.zip'
      const zipDirPath = path.dirname(zipFilePath)
      // 创建压缩包文件夹
      mkdirSync(zipDirPath, { recursive: true })

      // 如果已经存在压缩包了，则重命名
      if (fs.existsSync(zipFilePath)) {
        const extname = path.extname(zipFilePath)
        const newZipFileName = path.basename(zipFilePath, extname) + format(new Date(), '_yyyyMMdd_HHmmss') + extname
        fs.renameSync(zipFilePath, zipDirPath + path.sep + newZipFileName)
      }

      // 生成压缩包
      zipHelper.zipFolder(sourcePath, zipFilePath)
    },
  }
}
